﻿using System;
using System.Windows.Forms;
using SoftwareConsulting.BI11.Studio.BasicEntities;
using SoftwareConsulting.BI11.Studio.Core.Project.LogicalInferenceMechanism;
using SoftwareConsulting.BI11.Studio.Core.Project.SituationsHierarchy;
using SoftwareConsulting.BI11.Studio.InternalServices;
using SoftwareConsulting.BI11.Studio.UI.ProjectExplorer.LogicalInferenceMechanism;
using SoftwareConsulting.BI11.Studio.UI.ProjectExplorer.SituationsHierarchy;
using SoftwareConsulting.Interfaces.BasicEntities;
using SoftwareConsulting.BI11.Studio.UI.Properties;

namespace SoftwareConsulting.BI11.Studio.UI.ProjectExplorer
{
    /// <summary>
    /// Класс главной формы
    /// </summary>
    public partial class MainForm : UniqueForm
    {
        #region поля                
        private SituationsBindingForm _situationsbindForm; //ссылка на форму результатов привязки ситуаций
        private ProjectExplorerForm _projectExplorer; //ссылка на форму обозревателя проекта                
        private SituationsHierarchyForm _situationsHierarchyForm; //ссылка на форму РП                
        #endregion

        #region публичные свойства        
        /// <summary>
        /// Возвращает/устанавливает ссылку на форму РП
        /// </summary>
        public SituationsHierarchyForm HierarchyForm
        {
            get
            {
                return _situationsHierarchyForm;
            }
            set
            {
                _situationsHierarchyForm = value;
            }
        }                

        /// <summary>
        /// Возвращает обозреватель проекта
        /// </summary>
        public ProjectExplorerForm ProjectExplorer
        {
            get
            {
                return _projectExplorer;
            }            
        }        
        #endregion

        #region внутренние методы        
        /// <summary>
        /// Обновление состояния галочек напротив окон в меню "Окна"
        /// </summary>
        private void UpdateWindowsMenu()
        {            
            результатыПривязкиСитуацийToolStripMenuItem.Checked = _situationsbindForm.Visible;
            иерархияСитуацийToolStripMenuItem.Checked = HierarchyForm.Visible;
            bool hasChilds = MdiChildren.Length > 0;
            расположитьвертикальноToolStripMenuItem.Enabled = hasChilds;
            расположитьгоризонтальноToolStripMenuItem.Enabled = hasChilds;
            распололожитькаскадомToolStripMenuItem.Enabled = hasChilds;
            упорядочитьЗначкиToolStripMenuItem.Enabled = hasChilds;
        }

        /// <summary>
        /// Закрытие чайлдов области ситуаций
        /// </summary>
        public void CloseSituationsAreaChilds()
        {
            _situationsbindForm.CloseAbsolutely();
            HierarchyForm.CloseAbsolutely();                
        }

        /// <summary>
        /// Отображение/скрытие окна с результатами привязки ситуаций (автоопределение)
        /// </summary>
        private void ShowOrHideSituationsBindingForm()
        {
            if (_situationsbindForm.Visible)
            {
                _situationsbindForm.Hide();
            }
            else
            {
                ShowOrHideSituationsHierarchyForm(false);
                _situationsbindForm.MdiParent = this;
                _situationsbindForm.Show();
                ShowOrHideSituationsHierarchyForm(true);
            }
        }
        
        /// <summary>
        /// Отображение/скрытие окна с иерархией ситуаций (автоопределение)
        /// </summary>
        private void ShowOrHideSituationsHierarchyForm()
        {
            if (HierarchyForm.Visible)
            {
                HierarchyForm.Hide();
            }
            else
            {
                HierarchyForm.MdiParent = this;
                HierarchyForm.Dock = DockStyle.Fill;
                HierarchyForm.Show();
            }
        }                                                       

        /// <summary>
        /// МЛВ: Рассмотрение всех ситуаций
        /// </summary>
        private void ConsiderSituations(bool debugMode)
        {                       
            //***выгружаем все элементы МЛВ в реальные значения характеристик
            foreach (LIMItem li in _projectExplorer.ProjectLink.LIMItemsCollection)
            {                
                INamedHierarchy<Characteristic> chs = _projectExplorer.ProjectLink.GetCharacteristicsByName(li.Name);
                foreach (Characteristic ch in chs)
                {                    
                    ch.RealValue = li.Value;
                }
            }
            //********************************************************
            double curminute = 1;
            Random rand = new Random();
            while ((_projectExplorer.ProjectLink.SelectNextConsideredSituation()) && (curminute <= 90))
            {
                Guid consideredSituationId = _projectExplorer.ProjectLink.ConsiderSituation(_projectExplorer.ProjectLink.LastWorldKey);
                Situation sit = _projectExplorer.ProjectLink.GetItemById(consideredSituationId);
                bool success = (bool)sit.InferenceResult;
                if (success)
                {
                    int c = sit.PhrasesCount();
                    if (c > 0)
                    {
                        int ran = rand.Next(0, c);
                        double d = sit.Duration + rand.NextDouble() * 0.2 * sit.Duration * rand.Next(-1, 2);
                        curminute += d;
                        _situationsbindForm.AddEvent(curminute, sit.GetPhraseByPosition(ran).InternalPhraseToExternal());                        
                    }
                }
                if (debugMode)
                {
                    HierarchyForm.CurrentSituationsArea.GotoSituationBoxBySituation(sit);
                    SituationConsiderationResultsForm SHConsiderResultForm = new SituationConsiderationResultsForm(_projectExplorer.ProjectLink, sit.Id);
                    if (SHConsiderResultForm.ShowDialog() == DialogResult.Abort)
                    {
                        debugMode = false;
                    }
                }
            }
        }

        /// <summary>
        /// Вызывает окно МЛВ
        /// </summary>
        private void ShowLIMDialog()
        {
            if (!_projectExplorer.ProjectLink.DeserializeLIM(_projectExplorer.BlockAccessToApplicationFolder))
            {
                GeneralMethods.ShowInformation(Resources.BI_SITUATIONSHIERARCHY_LIM_NOTUPDATED);                
            }
            LogicalInferenceStartDialog RunLimDialog = new LogicalInferenceStartDialog(_projectExplorer.ProjectLink);
            DialogResult d = RunLimDialog.ShowDialog();
            if ((d == DialogResult.OK)||(d == DialogResult.Yes))
            {
                //отображаем форму результатов привязки ситуаций
                _situationsbindForm.ClearPhrases();
                ShowOrHideSituationsBindingForm(true);
                if (d == DialogResult.Yes)
                {
                    if (HierarchyForm.InRulesContainerEditor)
                    {
                        HierarchyForm.ShowOrHideRulesContainerEditor(null, false);
                    }
                }                
                //собственно МЛВ
                try
                {
                    ConsiderSituations(d == DialogResult.Yes);                    
                }
                catch(BIException ex)
                {
                    GeneralMethods.ShowUserError(ex.Message);
                }
                if (d == DialogResult.Yes)
                {
                    GeneralMethods.ShowInformation(Resources.BI_SITUATIONSHIERARCHY_LIM_RESULT_FINISH);                    
                }                
            }
            _projectExplorer.ProjectLink.DestroyLIM();            
        }        

        /// <summary>
        /// Обработка изменения активности формы
        /// </summary>
        /// <param name="isActive"></param>
        private void ProcessFormActivityChanged(bool isActive)
        {
            if (HierarchyForm != null)
            {
                if (isActive)
                {
                    HierarchyForm.SetScrollInfo();
                }
                else
                {
                    HierarchyForm.ReadScrollInfo();
                }
            }
        }                                    
        #region обработчики
        private void расположитьвертикальноToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileVertical);
        }

        private void расположитьгоризонтальноToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.TileHorizontal);
        }

        private void распололожитькаскадомToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.Cascade);
        }

        private void упорядочитьЗначкиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            LayoutMdi(MdiLayout.ArrangeIcons);
        }

        /// <summary>
        /// Обработка раскрытия меню "Окна"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void окнаToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            UpdateWindowsMenu();
        }

        /// <summary>
        /// Обработка выбора пункта меню "Трансляция матча"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void трансляцияМатчаToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowOrHideSituationsBindingForm();
        }        

        /// <summary>
        /// Обрабатывает первое отображение формы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainForm_Shown(object sender, EventArgs e)
        {
            if (HierarchyForm.Visible)
            {
                HierarchyForm.CenterSituationsArea();
            }            
        }

        /// <summary>
        /// Обработка выбора пункта меню "Иерархия ситуаций"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void иерархияСитуацийToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowOrHideSituationsHierarchyForm();
        }

        /// <summary>
        /// Обработка выбора пункта меню "Механизм логического вывода..."
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void запускМЛВToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ShowLIMDialog();
        }

        private void трансляцияToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
        {
            UpdateWindowsMenu();
        }

        /// <summary>
        /// Обработка деактивации формы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MDIParentForm_Deactivate(object sender, EventArgs e)
        {            
            ProcessFormActivityChanged(false);
        }

        /// <summary>
        /// Обработка активации формы
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MDIParentForm_Activated(object sender, EventArgs e)
        {            
            ProcessFormActivityChanged(true);            
        }
        #endregion
        #endregion

        #region публичные методы        
        /// <summary>
        /// Возвращает флаг того отображена ли форма иерархии ситуаций
        /// </summary>
        /// <returns></returns>
        public bool IsSituationsHierarchyFormVisible()
        {
            return HierarchyForm.Visible;
        }        

        /// <summary>
        /// Отображает редактор контейнера правил, если надо
        /// </summary>
        public void RestoreRulesContainerEditorIfNecessary()
        {
            HierarchyForm.RestoreRulesContainerEditorIfNecessary();
        }

        /// <summary>
        /// Отображение/скрытие окна с иерархией ситуаций (по параметру)
        /// </summary>
        public void ShowOrHideSituationsHierarchyForm(bool toShow)
        {
            if (!toShow)
            {
                HierarchyForm.Hide();
            }
            else
            {
                HierarchyForm.MdiParent = this;
                HierarchyForm.Dock = DockStyle.Fill;
                HierarchyForm.Show();
                HierarchyForm.ShowOrHideRulesContainerEditor(null, false);
            }
        }        

        /// <summary>
        /// Отображение/скрытие окна с результатами привязки ситуаций (по параметру)
        /// </summary>
        public void ShowOrHideSituationsBindingForm(bool toShow)
        {
            if (!toShow)
            {
                _situationsbindForm.Hide();
            }
            else
            {
                ShowOrHideSituationsHierarchyForm(false);
                _situationsbindForm.MdiParent = this;
                _situationsbindForm.Show();
                ShowOrHideSituationsHierarchyForm(true);
                RestoreRulesContainerEditorIfNecessary();
            }
        }        
        #endregion

        #region конструкторы и финализаторы
        /// <summary>
        /// Инициализация компонентов формы
        /// </summary>
        public MainForm(ProjectExplorerForm projectExplorer):base()
        {
            _projectExplorer = projectExplorer;
            _situationsbindForm = new SituationsBindingForm(this);
            HierarchyForm = new SituationsHierarchyForm(projectExplorer);
            InitializeComponent();
        }
        #endregion                                                                                                        
    }
}
